/* typehints:start */
import { GameRoot } from "../root";
/* typehints:end */

import { clamp, getAttrOrOther, getObjectType, getRandomNum } from "../../core/utils/utils";
import { LimbsTypeDefine } from "../defines/people_limbs";
import { SOUNDS } from "../../core/sound/interface";

export class Skill{
  constructor(root, num = 0){
    /** @type {GameRoot} */
    this.root = root;

    // 技能熟练度
    this.num = num;

    // 技能key
    this.key = null;

    this.animTime = null;
  }

  getName(){
    abstract;
  }

  getDesc(){
    abstract;
  }

  /**
   * 获取行动力消耗
   * @returns 
   */
  getAction(){
    return 1;
  }

  /**
   * 该技能的tag
   */
  getTags(){
    return [];
  }

  /**
   * 可选择的单位数量
   */
  getTargetNum(){
    return 1;
  }

  /**
   * 是否为玩家选择单位
   */
  getIsPlayerSelectTarget(){
    return true;
  }

  /**
   * 电脑自动获取单位
   */
  getTargets(){
    return false;
  }

  getTip(i = 0){
    return '已选中'
  }

  /**
   * 是否需要对应的肢体才能发动
   * @returns 
   */
  getNeedLimbs(){
    return [];
  }

  /**
   * 获取需要的数据
   * @returns 
   */
  getData(){
    return new Promise(resolve => {
      resolve({});
    })
  }

  /**
   * 在战斗中，获取当前单位的数据
   * @param {*} key 
   */
  getBattleData(key){
    if(!key) return false;

    if(this.root.battleMgr.actionUnit){
      let data = getAttrOrOther(this.root.battleMgr.actionUnit.action.data, key, null);
      if(data) return data;
    }

    return false;
  }

  /**
   * Ai直接获取需要的数据
   */
  getAiData(){
    return {};
  }

  /**
   * ai执行该技能
   */
  aiRun(){
    let data = this.getAiData();
    this.root.battleMgr.actionUnit.action = {
      skill: this,
      targets: this.getTargets(),
      data
    };
  }

	/**
	 * 生灵使用该物品判断是否匹配需求属性
	 * @param {People} people 
	 */
	getPeopleHaveLimbs(people){
		let needLimbs = this.getNeedLimbs();
    let limbs = people.getLimbs();

    for(let i = 0; i < needLimbs.length; i++){
      let limb = needLimbs[i];
      let findLimb = limbs.find(item => item.key == limb.key);

      if(!findLimb) return false;
    }

    return true;
	}

  /**
   * 执行技能战斗表现流程
   */
  implement(){
    return new Promise(resolve => {
      this.runEffect().then(() => {
        this.runSkill();
        resolve();
      })
    })
  }

  /**
   * 执行动画
   */
  runEffect(){
    return new Promise(resolve => {
      setTimeout(() => {
        resolve();
      }, 500);
    })
  }

  /**
   * 执行技能效果
   */
  runSkill(){}

  /**
   * ----------    内部方法    ------------
   */

  internalGetTags(){
    let targetNum = this.getTargetNum();
    let action = this.getAction();

    return [...[
      { text: getObjectType(action) == 'Number' ? action * 100 + '%' : action, img: 'res/ui/icons/action.svg' },
      { 
        text: targetNum < 1 ? '仅自身' 
          : targetNum == 1 ? '单体'
          : `群体: ${targetNum}`
      }
    ], ...this.getTags()];
  }

  /**
   * 获取技能是否可以使用
   * 参数为使用这个技能的生灵
   */
  internalGetIsUse(people){
    let flag = true;

    if(!people){
      return '没有传入使用该技能的生灵';
    }

    let haveLimbs = this.getPeopleHaveLimbs(people);
    if(!haveLimbs){
      flag = `生灵需要拥有: ${this.getNeedLimbs().map(item => item.text).join(', ')}`;
    }

    return flag;
  }
}